package com.xm.lock.happy;

import java.util.concurrent.locks.StampedLock;

/**
 * StampedLock
 * 原理：
 *   StampedLock 是 Java 8 引入的一种锁机制，支持乐观读锁。
 *   它通过返回一个戳记（Stamp）来标识锁的状态，读操作不会阻塞写操作。
 * 特点：
 *   支持乐观读锁，提高读操作的性能。
 *   适用于读多写少的场景。
 */
public class TestStampedLock03 {
    private int count = 0;
    private final StampedLock lock = new StampedLock();

    public void increment() {
        long stamp = lock.writeLock();// 写锁
        try {
            count++;
        } finally {
            lock.unlockWrite(stamp);// 释放写锁
        }
    }

    public int getCount() {
        long stamp = lock.tryOptimisticRead();
        int currentCount = count;//感觉这里有点奇怪
        if (!lock.validate(stamp)) {// 检查是否有写操作
            stamp = lock.readLock();// 获取悲观读锁
            try {
                currentCount = count;
            } finally {
                lock.unlockRead(stamp);// 释放读锁
            }
        }
        return currentCount;
    }
}
